// 定制管道 实现PipeTransform接口
// PipeTransform<T, R> 是一个通用接口，任何管道都必须实现。泛型接口用 T 表示输入 value 的类型，用 R 表示 transform() 方法的返回类型。

import {
  PipeTransform,
  Injectable,
  ArgumentMetadata,
  BadRequestException,
} from '@nestjs/common';

import { validate } from 'class-validator';
import { plainToInstance } from 'class-transformer';
@Injectable()
export class ValidationPipe implements PipeTransform {
  // value 参数是当前处理的方法参数（在被路由处理方法接收之前），metadata 是当前处理的方法参数的元数据。
  //   transform(value: any, metadata: ArgumentMetadata) {
  //     return value;
  //   }
  async transform(value: any, { metatype }: ArgumentMetadata) {
    if (!metatype || !this.toValidate(metatype)) {
      return value;
    }
    const object = plainToInstance(metatype, value);
    const errors = await validate(object);
    if (errors.length > 0) {
      throw new BadRequestException('数据格式不正确');
    }
    return value;
  }

  private toValidate(metatype: Function): boolean {
    const types: Function[] = [String, Boolean, Array, Object];
    return !types.includes(metatype);
  }
}
// 元数据对象具有以下属性：
// export interface ArgumentMetadata {
//     type: 'body' | 'query' | 'param' | 'custom';
//     metatype?: Type<unknown>;
//     data?: string;
//   }
